package com.wg.springboot.apache.methodutil;

import org.apache.commons.lang3.reflect.MethodUtils;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @Description: 反射工具类
 * @Author WuGang
 * @Date 2021/10/25 14:00
 * @Version 1.0
 * CSDN失效作罢：https://blog.csdn.net/han12398766/article/details/104589484
 */
public class Invokes {
    public void say() {
        System.out.println("动态无参");
    }
    public void say1(String s) {
        System.out.println("动态有参"+s);
    }
    private void say2() {
        System.out.println("动态有参");
    }
    public void say3(String s) {
        System.out.println("动态有参"+s);
    }

    public static void sayy(){
        System.out.println("静态无参");
    }
    public static void sayy1(String a){
        System.out.println("静态有参"+a);
    }
//    居然可以方法名一样  这样的重载是什么意思   两个都能运行  不会覆盖
    public static void say(String a){
//    public static void say3(String a){   这样不构成重载是不行的
        System.out.println("静态有参"+a);
    }
    private static void sayy2(String a){
        System.out.println("静态有参"+a);
    }
}

class Br {
    public static void main(String[] args) throws InvocationTargetException, NoSuchMethodException, IllegalAccessException {
//        反射工具类几种用法
        Invokes testMethod = new Invokes();
//        调用无参pubclic修饰的方法，第一个参数是对象，第二个参数是方法名
        MethodUtils.invokeMethod(testMethod, "say");
//        调用有参方法pubclic修饰的方法，第一个参数是对象，第二个参数是方法名，第三个参数是参数
        MethodUtils.invokeMethod(testMethod,"say1", "：参数");
//        调用无参的方法，第一个参数是对象，第二个参数是任何修饰的方法都可以访问(默认、protected、private、public)，第三个是方法名
        MethodUtils.invokeMethod(testMethod, true,"say2");
//        调用有参的方法，第一个参数是对象，第二个参数是任何修饰的方法都可以访问(默认、protected、private、public)，第三个是方法名，第四个参数是参数
        MethodUtils.invokeMethod(testMethod, true,"say3","：参数");
//        从名字上来看，明显是后者准确性更高，或者说要求更严格。invokeExact方法在调用时要求严格的类型匹配，比如：方法形参是int，parameterTypes里面传的是Integer.class，此时就会报错
        MethodUtils.invokeExactMethod(testMethod, "say");
//        静态方法
        MethodUtils.invokeStaticMethod(Invokes.class, "sayy");
        MethodUtils.invokeStaticMethod(Invokes.class, "sayy1","：参数");
        MethodUtils.invokeStaticMethod(Invokes.class, "say","：参数");
        MethodUtils.invokeExactStaticMethod(Invokes.class, "say","：say参数");
//        MethodUtils.invokeStaticMethod(Invokes.class, true,"sayy2","：参数");   这种是不行的

        testMethod.say();
        Invokes.say("00");

        Method accessibleMethod = MethodUtils.getAccessibleMethod(Invokes.class,"say");
        System.out.println(accessibleMethod);  //public void com.wg.springboot.apache.methodutil.Invokes.say()输出完整的方法
    }
}
